package com.b1.taskmanagerserver.api;
import com.b1.taskmanagerserver.parser.ContactXml;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import java.util.ListIterator;
import org.apache.log4j.Category;
import org.apache.log4j.Logger;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;

/**
 *  Реализация интерфейса ContactListInterface
 * класс работы со списком контактов
 *
 */
public class ContactList implements ContactListInterface
{
    private static final Logger log = Logger.getLogger(ContactList.class);
    private List<Contact> contactList;      //список контактов

    /**
     * метод возвращения списка контактов
     * @return 
     */
    public List<Contact> getContactList() 
    {
        return contactList;
    }
    
    /**
     * метод присваивания значения списку контактов
     * @param contactList 
     */
    public void setContactList(List<Contact> contactList) {
        this.contactList = contactList;
    }
    
    /**
     * конструктор класса
     * инициализирует список контактов
     * и обеспечивает загрузку данных в него из файла
     */
    public ContactList() 
    {
        contactList = new ArrayList<Contact>();
        contactList = load();
        
    }
    
    /**
     * метод добавления новго контакта в лист
     * @param ct 
     */
    public void addContactToList(Contact ct)
    {
        contactList.add(ct);
    }
    
    /**
     * Добавление нового контакта только по его имени
     * @param firstName 
     */
    @Override
    public void addContact(String firstName)
    {
        addContact(firstName,"","");
    }
    
    /**
     * создание и Добавление нового контакта в contactList
     * @param firstName
     * @param lastName
     * @param homePhone 
     */
    public void addContact(String firstName,String lastName,String homePhone)
    {
        Contact newContact = new Contact((int)System.currentTimeMillis(), firstName);
        newContact.setHomePhone(homePhone);
        newContact.setLastName(lastName);
        contactList.add(newContact);
        save();
    }
    
    /**
     * возращение всех контактовв в виде строки хранящихся в contactList
     * @return 
     */
    public String showContactList()
    {
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < contactList.size(); i++)
            str.append(i+"\t"+contactList.get(i).showField()+"\n");
        return str.toString();
    }
    
    /**
     * метод возвращения котакта по его id в contactList
     * @param id
     * @return 
     */
    public Contact getContactByNumber(int id)
    {
        for (ListIterator<Contact> i = contactList.listIterator(); i.hasNext();) {
            Contact ct = i.next();
            if (ct.getId() == id) {
                return ct;
            }
        }
        log.warn("No found contact");
        return null;   
    }
    
    /**
     * метод изменения котакта в списке по id
     * @param id
     * @param firstName
     * @param lastName
     * @param phone 
     */
    @Override
    public void cahngeContact(int id,String firstName,String lastName,String phone)
    {
        for (ListIterator<Contact> i = contactList.listIterator(); i.hasNext();) {
            Contact ct = i.next();
            if (ct.getId() == id) 
            {
                ct.setFirstName(firstName);
                ct.setLastName(lastName);
                ct.setHomePhone(phone);
                save();
                break;
            }
        }
    }
    
    /**
     * Загрузка контактов из xml файла
     * и добавление их в contactList
     * @return 
     */
    @Override
    public List<Contact> load()
    {
        try 
        {
            ContactXml contactFile = new ContactXml();
            String contactArray[][] = contactFile.getContactArray();
            Contact ct;
            for (int i = 0; i < contactArray.length; i++) 
            {
                ct = new Contact(Integer.parseInt(contactArray[i][0]), contactArray[i][1]);
                ct.setLastName(contactArray[i][2]);
                ct.setHomePhone(contactArray[i][3]);
                contactList.add(ct);
            }
        } 
        catch (IOException ex) {
            log.warn(ContactList.class.getName(), ex);
        } 
        catch (SAXException ex) {
            log.warn(ContactList.class.getName(), ex);
        } 
        catch (ParserConfigurationException ex) {
            log.warn(ContactList.class.getName(), ex);
        }
        return contactList;
    }
    
    /**
     * Сохранение контактов из contactList в xml файл
     * @return 
     */
    @Override
    public boolean save()
    {
        ContactXml cx;
        try 
        {
            cx = new ContactXml();
            cx.writeXml(listToString());
        } 
        catch (IOException ex) {
            log.warn(ContactList.class.getName(), ex);
        } catch (SAXException ex) {
            log.warn(ContactList.class.getName(), ex);
        } catch (ParserConfigurationException ex) {
            log.warn(ContactList.class.getName(), ex);
        }
        return true;
    } 
    
    
    /**
     * удаление контакта из contactList по id
     * @param id
     * @return 
     */
    @Override
    public boolean delContact(int id) 
    {
        for (ListIterator<Contact> i = contactList.listIterator(); i.hasNext();) 
        {
            Contact ct = i.next();
            if (ct.getId() == id) {
                i.remove();
                break;
            }
        }
        save();
        return true;
    }
    
    /**
     * Возвращение contactList в виде String[length][3]
     * length - количество контактов в листе
     * @return String [][]
     */
    public String[][] listToString()
    {
        String[][] s = new String[contactList.size()][4];
        for(int i = 0; i<contactList.size();i++)
        {
            Contact ct = contactList.listIterator(i).next();
            s[i][0] = String.valueOf(ct.getId());
            s[i][1] = ct.getFirstName();
            s[i][2] = ct.getLastName();
            s[i][3] = ct.getHomePhone();
        }
        return s;
    }
    
    /**
     * возращение списка id контактов которые содержатся в contactList
     * @return String
     */
    public String listContactId()
    {
        String s="";
        for(int i = 0; i<contactList.size();i++)
        {
            Contact ct = contactList.listIterator(i).next();
            s+= String.valueOf(ct.getId())+" ";
        }
        return s;
    }
}
